using System;
using System.Text;
using TccAg.VO;
using System.Data;
using System.Collections;
using System.Collections.Generic;
using NeoLib2k8;
using System.Data.SqlClient;

namespace TccAg.DA
{
    public class AcoeDA
    {
        private String queryInsert = "INSERT INTO acoes( SOLUCAO, TIPO, ID_RECURSO, ID_ORIGEM) VALUES( @solucao, @tipo, @id_recurso, @id_origem)";
        private String queryUpdate = "UPDATE acoes SET solucao = @solucao, tipo = @tipo, id_recurso = @id_recurso, id_origem = @id_origem WHERE ID = @id";
        private String queryDelete = "DELETE FROM acoes WHERE ID = @id";
        private String queryLoadAll = "SELECT  id, solucao, tipo, id_recurso, id_origem FROM acoes";
        private String queryLoadByPk = "SELECT  id, solucao, tipo, id_recurso, id_origem FROM acoes WHERE ID = @id";
        private String queryLoadByFk = "SELECT  id, solucao, tipo, id_recurso, id_origem FROM acoes WHERE SOLUCAO = @solucao";
        private SqlConnection conexao = new SqlConnection(Security.getConnectionString(Constantes.cod_sql_server_express_2005));

        //INSERIR 
        public int inserir(AcoesVO acoe)
        {
            try
            {
                SqlCommand cmd;
                cmd = conexao.CreateCommand();
                cmd.CommandType = System.Data.CommandType.Text;
                cmd.CommandText = queryInsert;

                if (acoe.Solucao.HasValue)
                        cmd.Parameters.Add(new SqlParameter("@solucao", (object) acoe.Solucao));
                else
                        cmd.Parameters.Add(new SqlParameter("@solucao", (object) DBNull.Value));

                if (acoe.Tipo.HasValue)
                        cmd.Parameters.Add(new SqlParameter("@tipo", (object) acoe.Tipo));
                else
                        cmd.Parameters.Add(new SqlParameter("@tipo", (object) DBNull.Value));

                if (acoe.Idrecurso.HasValue)
                        cmd.Parameters.Add(new SqlParameter("@id_recurso", (object) acoe.Idrecurso));
                else
                        cmd.Parameters.Add(new SqlParameter("@id_recurso", (object) DBNull.Value));

                if (acoe.Idorigem.HasValue)
                        cmd.Parameters.Add(new SqlParameter("@id_origem", (object) acoe.Idorigem));
                else
                        cmd.Parameters.Add(new SqlParameter("@id_origem", (object) DBNull.Value));

                conexao.Open();
                return cmd.ExecuteNonQuery();

            }
            catch (Exception)
            {
                throw;
            }
            finally
            {
                if (conexao.State == System.Data.ConnectionState.Open) conexao.Close();
            }
        }

        //ATUALIZAR 
        public int atualizar(AcoesVO acoe)
        {
            try
            {
                SqlCommand cmd;
                cmd = conexao.CreateCommand();
                if (acoe.Id.HasValue)
                    cmd.Parameters.Add(new SqlParameter("@id", (object)acoe.Id));
                else
                    throw new Exception("Parâmetro necessário não enviado para o DA");

                cmd.CommandType = System.Data.CommandType.Text;
                cmd.CommandText = queryUpdate;

                if (acoe.Solucao.HasValue)
                        cmd.Parameters.Add(new SqlParameter("@solucao", (object) acoe.Solucao));
                else
                        cmd.Parameters.Add(new SqlParameter("@solucao", (object) DBNull.Value));
                if (acoe.Tipo.HasValue)
                        cmd.Parameters.Add(new SqlParameter("@tipo", (object) acoe.Tipo));
                else
                        cmd.Parameters.Add(new SqlParameter("@tipo", (object) DBNull.Value));
                if (acoe.Idrecurso.HasValue)
                        cmd.Parameters.Add(new SqlParameter("@id_recurso", (object) acoe.Idrecurso));
                else
                        cmd.Parameters.Add(new SqlParameter("@id_recurso", (object) DBNull.Value));
                if (acoe.Idorigem.HasValue)
                        cmd.Parameters.Add(new SqlParameter("@id_origem", (object) acoe.Idorigem));
                else
                        cmd.Parameters.Add(new SqlParameter("@id_origem", (object) DBNull.Value));
                conexao.Open();
                return cmd.ExecuteNonQuery();

            }
            catch (Exception)
            {
                throw;
            }
            finally
            {
                if (conexao.State == System.Data.ConnectionState.Open) conexao.Close();
            }
        }

        //EXCLUIR 
        public int excluir(AcoesVO acoe)
        {
            try
            {
                SqlCommand cmd;
                cmd = conexao.CreateCommand();
                cmd.CommandType = System.Data.CommandType.Text;
                cmd.CommandText = queryDelete;

                if (acoe.Id.HasValue)
                    cmd.Parameters.Add(new SqlParameter("@id", (object)acoe.Id));
                else
                    throw new Exception("Parâmetro necessário não enviado para o DA");

                conexao.Open();
                return cmd.ExecuteNonQuery();

            }
            catch (Exception)
            {
                throw;
            }
            finally
            {
                if (conexao.State == System.Data.ConnectionState.Open) conexao.Close();
            }
        }

        //LOAD ALL 
        public List<AcoesVO> loadAll()
        {
            try
            {
                List<AcoesVO> objRetorno = new List<AcoesVO>();
                AcoesVO objTemp;
                SqlCommand cmd;
                SqlDataReader dr;
                cmd = conexao.CreateCommand();
                cmd.CommandType = System.Data.CommandType.Text;
                cmd.CommandText = queryLoadAll;

                conexao.Open();
                dr = cmd.ExecuteReader();

                if (dr.HasRows)
                {
                    while (dr.Read())
                    {
                        objTemp = new AcoesVO();
                        if (dr["id"] != DBNull.Value)
                           objTemp.Id = (int?)dr["id"];

                        if (dr["solucao"] != DBNull.Value)
                           objTemp.Solucao = (int?)dr["solucao"];

                        if (dr["tipo"] != DBNull.Value)
                           objTemp.Tipo = (int?)dr["tipo"];

                        if (dr["id_recurso"] != DBNull.Value)
                           objTemp.Idrecurso = (int?)dr["id_recurso"];

                        if (dr["id_origem"] != DBNull.Value)
                           objTemp.Idorigem = (int?)dr["id_origem"];

                        objRetorno.Add(objTemp);
                    }
                }
                return objRetorno;
            }
            catch (Exception)
            {
                throw;
            }
            finally
            {
                if (conexao.State == System.Data.ConnectionState.Open) conexao.Close();
            }
        }

        //LOAD BY PK - Passa um objeto do tipo VO para em casos onde usar chave primária composta ter essas propriedades preenchidas
        public AcoesVO loadByPk(AcoesVO acoe)
        {
            try
            {
                AcoesVO objRetorno = null;
                AcoesVO objTemp;
                SqlCommand cmd;
                SqlDataReader dr;
                cmd = conexao.CreateCommand();
                if (acoe.Id.HasValue)
                    cmd.Parameters.Add(new SqlParameter("@id", (object)acoe.Id));
                else
                    throw new Exception("Parâmetro necessário não enviado para o DA");

                cmd.CommandType = System.Data.CommandType.Text;
                cmd.CommandText = queryLoadByPk;

                conexao.Open();
                dr = cmd.ExecuteReader();

                if (dr.HasRows)
                {
                    dr.Read();
                    {
                        objTemp = new AcoesVO();
                        if (dr["id"] != DBNull.Value)
                           objTemp.Id = (int?)dr["id"];

                        if (dr["solucao"] != DBNull.Value)
                           objTemp.Solucao = (int?)dr["solucao"];

                        if (dr["tipo"] != DBNull.Value)
                           objTemp.Tipo = (int?)dr["tipo"];

                        if (dr["id_recurso"] != DBNull.Value)
                           objTemp.Idrecurso = (int?)dr["id_recurso"];

                        if (dr["id_origem"] != DBNull.Value)
                           objTemp.Idorigem = (int?)dr["id_origem"];

                        objRetorno = objTemp;
                    }
                }
                return objRetorno;
            }
            catch (Exception)
            {
                throw;
            }
            finally
            {
                if (conexao.State == System.Data.ConnectionState.Open) conexao.Close();
            }
        }

        //LOAD BY FK - Passa um objeto do tipo VO para em casos onde usar chave estrangeira composta ter essas propriedades preenchidas
        public List<AcoesVO> loadByFk(AcoesVO acoe)
        {
            try
            {
                List<AcoesVO> objRetorno = new List<AcoesVO>();
                AcoesVO objTemp;
                SqlCommand cmd;
                SqlDataReader dr;
                cmd = conexao.CreateCommand();
                if (acoe.Solucao.HasValue)
                    cmd.Parameters.Add(new SqlParameter("@solucao", (object)acoe.Solucao));
                else
                    throw new Exception("Parâmetro necessário não enviado para o DA");

                cmd.CommandType = System.Data.CommandType.Text;
                cmd.CommandText = queryLoadByFk;

                conexao.Open();
                dr = cmd.ExecuteReader();

                if (dr.HasRows)
                {
                    dr.Read();
                    {
                        objTemp = new AcoesVO();
                        if (dr["id"] != DBNull.Value)
                           objTemp.Id = (int?)dr["id"];

                        if (dr["solucao"] != DBNull.Value)
                           objTemp.Solucao = (int?)dr["solucao"];

                        if (dr["tipo"] != DBNull.Value)
                           objTemp.Tipo = (int?)dr["tipo"];

                        if (dr["id_recurso"] != DBNull.Value)
                           objTemp.Idrecurso = (int?)dr["id_recurso"];

                        if (dr["id_origem"] != DBNull.Value)
                           objTemp.Idorigem = (int?)dr["id_origem"];

                        objRetorno.Add(objTemp);
                    }
                }
                return objRetorno;
            }
            catch (Exception)
            {
                throw;
            }
            finally
            {
                if (conexao.State == System.Data.ConnectionState.Open) conexao.Close();
            }
        }

        //DATATABLE LOAD ALL 
        public DataTable dataTableLoadAll()
        {
            try
            {
                SqlCommand cmd;
                cmd = conexao.CreateCommand();
                cmd.CommandType = System.Data.CommandType.Text;
                cmd.CommandText = queryLoadAll;

                conexao.Open();
                SqlDataAdapter dtAdpt = new SqlDataAdapter(cmd);
                DataTable dtTbl = new DataTable("tab_acoes");

                dtAdpt.Fill(dtTbl);
                return dtTbl;

            }
            catch (Exception)
            {
                throw;
            }
            finally
            {
                if (conexao.State == System.Data.ConnectionState.Open) conexao.Close();
            }
        }

    }
}
